#include <iostream>
#include <vector>
void foo()
{
    std::string s1("111");
    auto task = [=]()
    {
        std::string s2{std::move(s1)};
        std::cout << "inside lambda: " << s2 << '\n';
    };
    task();
    std::cout << "after move, outer size = " << s1 << '\n';
}
void bar()
{
    std::string s1("111");
    auto task = [&]()
    {
        std::string s2{std::move(s1)};
        std::cout << "inside lambda: " << s2 << '\n';
    };
    task();
    std::cout << "after move, outer size = " << s1 << '\n';
}
void gkd()
{
    std::string s1("111");
    // C++14 起，lambda 捕获列表可以直接写初始化表达式，形成**“按值捕获+移动语义
    // 捕获列表 不管该函数是否调用，已经搬走了
    auto task = [s2 = std::move(s1)]()
    {
        std::cout << "inside lambda: " << s2 << '\n';
    };
    task();
    std::cout << "after move, outer size = " << s1 << '\n';
}
void err_lambda()
{
    // lambda参数默认值：
    // 1、lambda 的自身参数，
    // 2、全局/静态变量，
    // 3、不能使用外围函数的局部变量。
    // std::vector<int> big(1'000'000, 7);
    // auto task = [](auto v = std::move(big))
    // {
    //     std::cout << "inside lambda: " << v.size() << '\n';
    // };
}
int main()
{
    // foo();
    // bar();
    // 此时gkd函数和bar函数类似
    gkd();

    // err_lambda()  这个这样写语义不一样、还会报错
    return 0;
}
